package designPatterns.stateDemo;

/**
 * @Author: Jie
 * @Date: 2019/5/30 18:09
 * @Function :状态 模式
 * <p>
 * https://blog.csdn.net/hguisu/article/details/7557252
 * <p>
 * 原因：
 * 使用if... ellse语句来做状态判断来进行不同情况的处理。
 * 但是对复杂状态的判断就显得“力不从心了”。
 * 随着增加新的状态或者修改一个状体（if else(或switch case)语句的增多或者修改）可能会引起很大的修改，而程序的可读性，扩展性也会变得很弱。
 * 维护也会很麻烦。那么我就考虑只修改自身状态的模式。
 * <p>
 * 问题：
 * 对象如何在每一种状态下表现出不同的行为？
 * <p>
 * 方案：
 * 状态模式：允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
 * 在很多情况下，一个对象的行为取决于一个或多个动态变化的属性，这样的属性叫做状态，这样的对象叫做有状态的(stateful)对象。
 * <p>
 * 适用性：
 *
 *
 * 下面我们总结一下状态模式的要点：
 *
 * 1.状态模式允许一个对象基于内部状态而拥有不同的行为。
 *
 * 2.状态模式用类代表状态
 *
 * 3.Context会将行为委托给当前状态对象
 *
 * 4.通过将每个状态封装进一个类，我们把以后需要做的任何改变局部化了
 *
 * 5.状态模式和策略模式有相同的类图，但是它们的意图不同
 *
 * 6.策略模式通常会用行为或算法来配置Context类
 *
 * 7.状态模式允许Context随着状态的改变而改变行为
 *
 * 8.状态转换可以由State类或Context类控制。
 *
 * 9.使用状态模式通常会导致设计中类的数目大量增加。
 *
 * 10.状态类可以被多个Context实例共享。
 */
public class StateMain {
    public static void main(String[] args) {
        StateMain stateMain = new StateMain();

        LuFei luFei = new LuFei();
        luFei.fire();
        luFei.setLuFeiState(luFei.SecondGear);
        luFei.fire();
        luFei.setLuFeiState(luFei.ThirdGear);
        luFei.fire();
        luFei.setLuFeiState(luFei.FourthGear);
        luFei.fire();

    }

   public static class LuFei{
       public static final ILuFeiState Ordinary = new Ordinary();//普通状态
       public static final ILuFeiState SecondGear = new SecondGear();//二挡状态
       public static final ILuFeiState ThirdGear = new ThirdGear();//三挡状态
       public static final ILuFeiState FourthGear = new FourthGear();//四挡状态
       private ILuFeiState luFeiState = Ordinary;//由于路飞一开始是普通状态，所以我们初始化state为ORDINARY
        public LuFei() {
        }

        public void setLuFeiState(ILuFeiState luFeiState) {
            this.luFeiState = luFeiState;
        }

       public void fire() {
           luFeiState.fire();
       }
   }



    interface ILuFeiState {
        void fire();
    }

    static class Ordinary implements ILuFeiState {
        @Override
        public void fire() {
            System.out.println("路飞当前为普通状态战斗");
        }
    }

    static class SecondGear implements ILuFeiState {
        @Override
        public void fire() {
            System.out.println("路飞开启二挡战斗");
        }
    }

    static class ThirdGear implements ILuFeiState {
        @Override
        public void fire() {
            System.out.println("路飞开启三挡战斗");
        }
    }

    static class FourthGear implements ILuFeiState {
        @Override
        public void fire() {
            System.out.println("路飞开启四挡战斗");
        }
    }
}
